/**
 * 角色验证器
 * 提供角色相关的请求数据验证规则
 */
import { body, param, query } from 'express-validator';

// 角色创建验证规则
const createRoleValidator = [
  body('name')
    .notEmpty().withMessage('角色名称不能为空')
    .isString().withMessage('角色名称必须是字符串')
    .isLength({ min: 2, max: 50 }).withMessage('角色名称长度必须在2-50之间'),
  
  body('code')
    .notEmpty().withMessage('角色编码不能为空')
    .isString().withMessage('角色编码必须是字符串')
    .isLength({ min: 2, max: 50 }).withMessage('角色编码长度必须在2-50之间')
    .matches(/^[A-Z_]+$/).withMessage('角色编码只能包含大写字母和下划线'),
  
  body('status')
    .optional()
    .isInt({ min: 0, max: 1 }).withMessage('状态值必须为0或1'),
  
  body('sort')
    .optional()
    .isInt({ min: 0 }).withMessage('排序值必须是非负整数'),
  
  body('description')
    .optional()
    .isString().withMessage('描述必须是字符串')
    .isLength({ max: 200 }).withMessage('描述长度不能超过200个字符'),
];

// 角色更新验证规则
const updateRoleValidator = [
  param('id')
    .notEmpty().withMessage('角色ID不能为空')
    .isInt({ min: 1 }).withMessage('无效的角色ID'),
  
  body('name')
    .optional()
    .isString().withMessage('角色名称必须是字符串')
    .isLength({ min: 2, max: 50 }).withMessage('角色名称长度必须在2-50之间'),
  
  body('code')
    .optional()
    .isString().withMessage('角色编码必须是字符串')
    .isLength({ min: 2, max: 50 }).withMessage('角色编码长度必须在2-50之间')
    .matches(/^[A-Z_]+$/).withMessage('角色编码只能包含大写字母和下划线'),
  
  body('status')
    .optional()
    .isInt({ min: 0, max: 1 }).withMessage('状态值必须为0或1'),
  
  body('sort')
    .optional()
    .isInt({ min: 0 }).withMessage('排序值必须是非负整数'),
  
  body('description')
    .optional()
    .isString().withMessage('描述必须是字符串')
    .isLength({ max: 200 }).withMessage('描述长度不能超过200个字符'),
];

// 角色ID验证规则
const roleIdValidator = [
  param('id')
    .notEmpty().withMessage('角色ID不能为空')
    .isInt({ min: 1 }).withMessage('无效的角色ID'),
];

// 角色列表查询参数验证规则
const roleListValidator = [
  query('page')
    .optional()
    .isInt({ min: 1 }).withMessage('页码必须是大于0的整数'),
  
  query('limit')
    .optional()
    .isInt({ min: 1, max: 100 }).withMessage('每页数量必须在1-100之间'),
  
  query('name')
    .optional()
    .isString().withMessage('角色名称必须是字符串'),
  
  query('code')
    .optional()
    .isString().withMessage('角色编码必须是字符串'),
  
  query('status')
    .optional()
    .isInt({ min: 0, max: 1 }).withMessage('状态值必须为0或1'),
];

// 角色菜单分配验证规则
const assignMenusValidator = [
  param('id')
    .notEmpty().withMessage('角色ID不能为空')
    .isInt({ min: 1 }).withMessage('无效的角色ID'),
  
  body('menuIds')
    .isArray().withMessage('菜单ID必须是数组')
    .custom(menuIds => {
      // 验证数组中的每个元素是否都是正整数
      if (!menuIds.every(id => Number.isInteger(id) && id > 0)) {
        throw new Error('菜单ID数组中包含无效的ID');
      }
      return true;
    }),
];

export {
  createRoleValidator,
  updateRoleValidator,
  roleIdValidator,
  roleListValidator,
  assignMenusValidator
}; 